001    /*
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: 2002-9-4
005     * Time: 13:50:04
006     * To change template for new class use
007     * Code Style | Class Templates options (Tools | IDE Options).
008     */
009    package EVolve.util.unifyutils;
010    
011    import EVolve.visualization.*;
012    import EVolve.visualization.XYViz.XYVisualization;
013    import EVolve.Scene;
014    import EVolve.util.unifyutils.UnifiedVisualization;
015    
016    import javax.swing.*;
017    import java.util.ArrayList;
018    import java.awt.*;
019    import java.awt.event.*;
020    
021    public class UnifiedVisualizationRunner {
022        private ArrayList[] unifiedDimension;
023        private JDialog dialog;
024        private List availableList;
025        private List unifiableList;
026        private ArrayList unifiableViz;
027        private JComboBox comboDimension;
028        private int dimension;
029    
030    
031        public UnifiedVisualizationRunner() {
032            unifiedDimension = new ArrayList[3];
033            for (int i=0;i<unifiedDimension.length;i++) unifiedDimension[i] = new ArrayList();
034            unifiableViz = new ArrayList();
035        }
036    
037        public void createDialog() {
038            dialog = new JDialog(Scene.getFrame(), "Unifying Visualizations...", true);
039            dialog.setBounds(new Rectangle(500,400));
040    
041            Box boxMain = new Box(BoxLayout.Y_AXIS);
042            boxMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
043                    "Choose Visualizations to be unified"));
044            dialog.getContentPane().add(boxMain,BorderLayout.CENTER);
045    
046            Box boxLabels = new Box(BoxLayout.X_AXIS);
047            boxLabels.add(new JLabel("Available visualizations:"));
048            boxLabels.add(Box.createHorizontalStrut(195));
049            boxLabels.add(new JLabel("Unifiable visualizations:"));
050    
051            Box boxLinkDimension = new Box(BoxLayout.Y_AXIS);
052            boxLinkDimension.setBounds(new Rectangle(20,300));
053            comboDimension = new JComboBox();
054            comboDimension.setEnabled(false);
055    
056    
057            boxLinkDimension.add(Box.createVerticalStrut(40));
058            boxLinkDimension.add(new JLabel("Choose unified dimension     "));
059            boxLinkDimension.add(Box.createVerticalStrut(10));
060            boxLinkDimension.add(comboDimension);
061            comboDimension.setBounds(new Rectangle(20,20));
062            boxLinkDimension.add(Box.createVerticalStrut(205));
063            comboDimension.addActionListener(new ActionListener() {
064                public void actionPerformed(ActionEvent e) {
065                    updateLinkableList();
066                }
067            });
068    
069    
070            Box boxLists = new Box(BoxLayout.X_AXIS);
071            availableList = new List(6,false);
072            ArrayList arr = Scene.getVisualizationManager().getVisualizationList();
073            for (int i=0; i<arr.size(); i++) {
074                availableList.add((((Visualization)arr.get(i)).getName()));
075            }
076            availableList.addItemListener(new ItemListener() {
077                public void itemStateChanged(ItemEvent e){
078                        updateComboDimension();
079                }
080            });
081            unifiableList = new java.awt.List(6,true);
082            boxLists.add(availableList);
083            boxLists.add(Box.createHorizontalStrut(10));
084            boxLists.add(boxLinkDimension);
085            boxLists.add(Box.createHorizontalStrut(10));
086            boxLists.add(unifiableList);
087    
088            boxMain.add(boxLabels);
089            boxMain.add(boxLists);
090    
091            Box boxOkCancel = new Box(BoxLayout.X_AXIS);
092            JButton buttonOK = new JButton("OK");
093            JButton buttonCancel = new JButton("Cancel");
094    
095            buttonOK.addActionListener(new ActionListener(){
096                public void actionPerformed(ActionEvent e){
097                    onOK();
098                }
099            });
100            buttonCancel.addActionListener(new ActionListener(){
101                public void actionPerformed(ActionEvent e){
102                    onCancel();
103                }
104            });
105            boxOkCancel.add(Box.createHorizontalStrut(180));
106            boxOkCancel.add(buttonOK);
107            boxOkCancel.add(Box.createHorizontalStrut(20));
108            boxOkCancel.add(buttonCancel);
109    
110            dialog.getContentPane().add(boxOkCancel,BorderLayout.SOUTH);
111        }
112    
113        private void updateComboDimension() {
114            int index = availableList.getSelectedIndex();
115    
116            if (index == -1) return;
117            Visualization visual = (Visualization) Scene.getVisualizationManager().getVisualizationList().get(index);
118            int[] flags = getLinkableDimension(visual);
119    
120            comboDimension.removeAllItems();
121            for (int i=0; i<flags.length; i++) {
122                switch (i) {
123                    case 0:
124                        if (flags[i] == 1)
125                            comboDimension.addItem("X-Axis");
126                        break;
127                    case 1:
128                        if (flags[i] == 1)
129                            comboDimension.addItem("Y-Axis");
130                        break;
131                    case 2:
132                        if (flags[i] == 1)
133                            comboDimension.addItem("Z-Axis");
134                        break;
135                }
136            }
137            if (comboDimension.getItemCount() != 0) {
138                comboDimension.setSelectedIndex(0);
139                comboDimension.setEnabled(true);
140            } else {
141                comboDimension.setEnabled(false);
142                unifiableList.removeAll();
143            }
144        }
145    
146        private void updateLinkableList() {
147            int index = availableList.getSelectedIndex();
148            Visualization visual = (Visualization) Scene.getVisualizationManager().getVisualizationList().get(index);
149    
150            String selectedItem = (String)comboDimension.getSelectedItem();
151            if (selectedItem.charAt(0) == 'X') {
152                dimension = 0;
153            } else if (selectedItem.charAt(0) == 'Y') {
154                dimension = 1;
155            } else {
156                dimension = 2;
157            }
158            unifiableList.removeAll();
159            getLinkableVisualization(visual,dimension);
160            for (int i=0; i<unifiableViz.size(); i++) {
161                unifiableList.add(((Visualization)unifiableViz.get(i)).getName());
162            }
163        }
164    
165        private int[] getLinkableDimension(Visualization visual) {
166            int[] returnVal = new int[visual.getDimension().length];
167    
168            for (int i=0; i<returnVal.length; i++) {
169                if (visual.getLinkableDimension(i) != null )
170                    returnVal[i] = 1;
171                else
172                    returnVal[i] = 0;
173            }
174            return returnVal;
175        }
176    
177        private void getLinkableVisualization(Visualization visual,int dimension) {
178            ArrayList arr = Scene.getVisualizationManager().getVisualizationList();
179    
180            unifiableViz.clear();
181            for (int i=0; i< arr.size(); i++) {
182                if (i == availableList.getSelectedIndex()) continue;
183                Visualization visual2 = (Visualization)arr.get(i);
184                if (isLinkable(visual,visual2,dimension)) unifiableViz.add(visual2);
185            }
186        }
187    
188        public void onOK() {
189            int[] indexes = unifiableList.getSelectedIndexes();
190    
191            if (indexes.length == 0) {
192                Scene.showErrorMessage("Please select visualizations to be linked");
193                return;
194            }
195    
196            Visualization[] viz= new Visualization[indexes.length +1];
197    
198            viz[0] = (Visualization)Scene.getVisualizationManager().getVisualizationList().get(availableList.getSelectedIndex());
199            for (int i=0; i<indexes.length; i++) {
200                viz[i+1] = (Visualization)unifiableViz.get(indexes[i]);
201            }
202            dialog.setVisible(false);
203            newLinkedVisualization(dimension,viz);
204            runLinkedVisualization();
205        }
206    
207        public void onCancel() {
208            dialog.setVisible(false);
209        }
210    
211        public void showWindow() {
212            createDialog();
213            Scene.getUIManager().showDialog(dialog, dialog.getWidth(), dialog.getHeight());
214        }
215    
216        public void newLinkedVisualization(int dim, Visualization[] viz) {
217            UnifiedVisualization linkedViz = null;
218            int linkingNo = -1;
219    
220            for (int j =0; j< viz.length; j++) {
221                for (int i = 0; i < unifiedDimension[dim].size(); i++) {
222                    linkedViz = (UnifiedVisualization) unifiedDimension[dim].get(i);
223                    if (linkedViz.exists(viz[j])) {
224                        linkingNo = i;
225                        j = viz.length +1;
226                        break;
227                    }
228                }
229            }
230    
231            if (linkingNo == -1) {
232                linkedViz = new UnifiedVisualization(dim);
233                unifiedDimension[dim].add(linkedViz);
234            }
235    
236            linkedViz.addVisualization(viz);
237        }
238    
239        public boolean isLinkable(Visualization visualLinked,Visualization visualLinking,int dim) {
240            int typeLinked, typeLinking;
241            ReferenceDimension linkableDim = visualLinked.getLinkableDimension(dim);
242    
243            if ((visualLinked.getLinkableDimension(dim) == null)||
244                (visualLinking.getLinkableDimension(dim) == null)) return false;
245    
246            typeLinked = linkableDim.getDataFilter().getTargetType();
247    
248            if (visualLinking.getDimension().length<dim+1)
249                return false;
250            else
251                typeLinking = visualLinking.getLinkableDimension(dim).getDataFilter().getTargetType();
252    
253            if ((visualLinking.getSubjectDefinition().getName().equals(visualLinked.getSubjectDefinition().getName())) &&
254                (visualLinking.getFactory().getName().equals(visualLinked.getFactory().getName())) &&
255                (visualLinking.getDimension()[0].getName().equals(visualLinked.getDimension()[0].getName())) &&
256                (visualLinking.getDimension()[1].getName().equals(visualLinked.getDimension()[1].getName())) &&
257                (visualLinking.getVisualizationID()==visualLinked.getVisualizationID()))
258                return false;
259    
260            if ((!(visualLinking instanceof XYVisualization))||(!(visualLinked instanceof XYVisualization)))
261                return false;
262    
263            return (typeLinked == typeLinking ? true : false);
264        }
265    
266        public void runLinkedVisualization() {
267            for (int i=0; i<unifiedDimension.length; i++) {
268                for (int j=0; j<unifiedDimension[i].size(); j++) {
269                    UnifiedVisualization linkedVisualization = (UnifiedVisualization)unifiedDimension[i].get(j);
270                    linkedVisualization.visualize();
271                }
272            }
273        }
274    
275        public void unregisterLinkedViz(Visualization viz) {
276            int delCount = 0;
277            for (int i=0; i<unifiedDimension.length; i++) {
278                for (int j=0; j<unifiedDimension[i].size(); j++) {
279                    UnifiedVisualization linkedVisualization = (UnifiedVisualization)unifiedDimension[i].get(j-delCount);
280                    int vizLeft = linkedVisualization.unregisterViz(viz);
281                    if (vizLeft == 0) {
282                        unifiedDimension[i].remove(j-delCount);
283                        delCount++;
284                    }
285    
286                }
287            }
288        }
289    }